package tsing.javase.annotation;

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Author Tsing/吴清平
 * @Date 2022/10/13 14:58
 * @Version 1.0
 *
 * aop使用示例
 */
//@Component
//@Aspect
//定义切面
public class AopLog {

    private static final Logger  log =LoggerFactory.getLogger(AopLog.class);

    @Pointcut("@annotation(org.tsing.javase.annotation.LogAnnotation)")  //通过注解定义切点
    public void webLog() {

    }

    //直接定义切点
//    @Pointcut("execution (* com.shangguan.aop.controller.*.*(..))")
//    public void test() {
//
//    }



    /**
         前置通知（@Before）：在目标方法调用之前调用通知

         后置通知（@After）：在目标方法完成之后调用通知(不管成功失败都执行)

         环绕通知（@Around）：在被通知的方法调用之前和调用之后执行自定义的方法

         返回通知（@AfterReturning）：在目标方法成功执行之后调用通知（只有成功才执行）

         异常通知（@AfterThrowing）：在目标方法抛出异常之后调用通知

     */


    @Around("webLog()")  //环绕通知
    public Object doArround(ProceedingJoinPoint point) throws Throwable {
        log.info("进入aop");
        Student student1 = new Student();
        student1.setAge(18);
        Object proceed = point.proceed(new Object[]{student1});
        String result = (String)proceed;
        System.out.println("result :"+result); //result :{"age":18,"name":"吴大帅"}
        Student student = JSON.parseObject(result,Student.class);
        student.setName(student.getName()+"大帅比");
        return  JSON.toJSONString(student);  // {age: 18,name: "吴大帅大帅比"}
    }


    @Before("webLog()")
    public void doBefore(){
        log.info("进入aop :doBefor()");

    }


    @After("webLog()")
    public void doAfter(){
        log.info("进入aop :doAfter()");
    }

    @AfterReturning("webLog()")
    public void  doAfterRuntrning(){
        log.info("进入aop :doAfterRuntrning()");
    }



    /*
        执行结果：
        进入aop
        进入aop :doBefor()
        student isStudent(name=null, age=18, major=null)
        进入aop :doAfterRuntrning()
        进入aop :doAfter()
        result :{"age":18,"name":"吴大帅"}
     */


}
